Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 引入到期时间概念,当非default的分组时将有到期时间概念 #1659

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

jinjianming
Copy link
Contributor

为什么做这个功能

背景: 因为我现在设置Vip组或者Svip的时候会解锁更多模型和优质线路和更低的倍率
问题: 但是我发现过于滥用比如一个用户说default的太慢想体验一下优质通道,后面开通的逐渐变多,导致和default一样卡顿;
解决: 引入开通vip渠道到期时间概念,类似淘宝的88vip,开通1月多少💰,会得到优质线路到期自动降级为default这样让vip有时间限制功能,通过发卡系统里面的人工处理后台开通vip;

效果图:

永不过期

image

特定到期时间

image

default与原先一致

image

后端降级用户条件:

  1. 当用户登录的时候会校验权益情况;
	// 校验用户是不是非default,如果是非default,判断到期时间如果过期了降级为default
	if user.ExpirationDate > 0 {
		// 将时间戳转换为 time.Time 类型
		expirationTime := time.Unix(user.ExpirationDate, 0)
		// 获取当前时间
		currentTime := time.Now()

		// 比较当前时间和到期时间
		if expirationTime.Before(currentTime) {
			// 降级为 default
			user.Group = "default"
			err := DB.Model(user).Updates(user).Error
			if err != nil {
				fmt.Printf("用户: %s, 降级为 default 时发生错误: %v\n", user.Username, err)
				return err
			}
			fmt.Printf("用户: %s, 特权组过期降为 default\n", user.Username)
		}
	}
  1. 会获取SYNC_FREQUENCY时间进行自动刷新所有用户权益,只有当NODE_TYPEmaster生效也就是NODE_TYPE默认值
for {
		time.Sleep(time.Duration(frequency) * time.Second)
		logger.SysLog("syncing options from database")
		if config.IsMasterNode {
			checkAndDowngradeUsers()
		}
		loadOptionsFromDatabase()
	}

close #issue_number

我已确认该 PR 已自测通过,相关截图如下:
(此处放上测试通过的截图,如果不涉及前端改动或从 UI 上无法看出,请放终端启动成功的截图)

@jinjianming jinjianming changed the title User rights feat: 引入到期时间概念,当非default的分组时将有到期时间概念 Jul 17, 2024
Copy link

codecov bot commented Jul 17, 2024

Codecov Report

Attention: Patch coverage is 0% with 42 lines in your changes missing coverage. Please review.

Project coverage is 1.28%. Comparing base (adba54a) to head (ade00ee).
Report is 1 commits behind head on main.

Files Patch % Lines
model/user.go 0.00% 34 Missing ⚠️
model/option.go 0.00% 7 Missing ⚠️
main.go 0.00% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##            main   #1659      +/-   ##
========================================
- Coverage   1.29%   1.28%   -0.01%     
========================================
  Files        142     142              
  Lines      10070   10112      +42     
========================================
  Hits         130     130              
- Misses      9926    9968      +42     
  Partials      14      14              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

fix: 修复旧用户的vip被降级,尽量不对原先用户做变动
@@ -435,3 +457,40 @@ func GetUsernameById(id int) (username string) {
DB.Model(&User{}).Where("id = ?", id).Select("username").Find(&username)
return username
}

func checkAndDowngradeUsers() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一条sql就能解决的事情 为什么要查询出来遍历?

model/option.go Outdated
@@ -95,6 +95,9 @@ func SyncOptions(frequency int) {
for {
time.Sleep(time.Duration(frequency) * time.Second)
logger.SysLog("syncing options from database")
if config.IsMasterNode {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没有必要放这里。 每天只要执行一次就够了

model/user.go Outdated
@@ -210,6 +213,25 @@ func (user *User) ValidateAndFill() (err error) {
if !okay || user.Status != UserStatusEnabled {
return errors.New("用户名或密码错误,或用户已被封禁")
}
// 校验用户是不是非default,如果是非default,判断到期时间如果过期了降级为default
if user.ExpirationDate > 0 {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

前面有定时任务。这里登陆不用判断了。

@MartialBE
Copy link
Collaborator

会员等级现在确实很鸡肋,但是我感觉每个人对会员等级的需求和定义是不一样的。这个方案真的是大家所需要的吗?

@jinjianming
Copy link
Contributor Author

会员等级现在确实很鸡肋,但是我感觉每个人对会员等级的需求和定义是不一样的。这个方案真的是大家所需要的吗?

我今天在优化一下上面提到的几个点,大佬可以看下:
1、sql直接更新用户而不是遍历;

	// 构建更新条件并执行更新
	result := DB.Model(&User{}).
		Where("`Group` <> ?", "default").
		Where("`username` <> ?", "root").
		Where("`expiration_date` IS NOT NULL").
		Where("`expiration_date` != ?", -1).
		Where("`expiration_date` < ?", currentTime).
		Update("Group", "default")

2、第二点提到每天执行一次,感觉还是做成可配置比较好默认24h执行一次这样?
3、第三点我感觉它的存在应该问题不大

@jinjianming
Copy link
Contributor Author

会员等级现在确实很鸡肋,但是我感觉每个人对会员等级的需求和定义是不一样的。这个方案真的是大家所需要的吗?

另外提到这个会员等级比较鸡肋,就像我什么描述的渠道不同质量不一样,我现在default用的是az和一些逆转的的接口,像vip高级的组就通过新加坡(CN2等优化线路)直接到openai的;
当然default的倍率会低多,也确实有人喜欢低价格,可以接受回复慢但是质量都是一样的接口;
此功能对于不用的用户来说是不影响的,里面都有考虑到兼容性;

@MartialBE
Copy link
Collaborator

MartialBE commented Jul 18, 2024

  1. expiration_date 可以直接给个默认值 0
  2. sql判断时 直接expiration_date大于0 and expiration_date 小于等于 当前时间
  3. 建议 过期时间只要 年月日 不需要具体时间
  4. 可以用 gocron 设置每天0点执行
  5. 当前时间可以直接获取前一天的日期
  6. 你可能还需要处理redis中缓存的用户组的问题

@jinjianming
Copy link
Contributor Author

  1. expiration_date 可以直接给个默认值 0
  2. sql判断时 直接expiration_date大于0 and expiration_date 小于等于 当前时间
  3. 建议 过期时间只要 年月日 不需要具体时间
  4. 可以用 gocron 设置每天0点执行
  5. 当前时间可以直接获取前一天的日期
  6. 你可能还需要处理redis中缓存的用户组的问题

okay的我改下

feat: 添加Redis更新缓存操作
fate: expiration_date设置默认值0
@jinjianming
Copy link
Contributor Author

  1. expiration_date 可以直接给个默认值 0
  2. sql判断时 直接expiration_date大于0 and expiration_date 小于等于 当前时间
  3. 建议 过期时间只要 年月日 不需要具体时间
  4. 可以用 gocron 设置每天0点执行
  5. 当前时间可以直接获取前一天的日期
  6. 你可能还需要处理redis中缓存的用户组的问题

已完成改造

@MartialBE
Copy link
Collaborator

我只是针对你功能提出的建议。
是否合并取决于作者意愿🤣🤣

@jinjianming
Copy link
Contributor Author

jinjianming commented Jul 18, 2024 via email

@songquanpeng
Copy link
Owner

按理说两个 approve 就可以合并了,不懂为什么现在没有生效

@MartialBE
Copy link
Collaborator

这个还没两个approve😂😂😂

@jinjianming
Copy link
Contributor Author

有任何进展

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants